package com.sun.task;

import com.sun.entity.Orders;
import com.sun.mapper.OrderMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;

/**
 * 自定义定义任务，实现订单定时状态的处理
 */
@Component
@Slf4j
public class OrderTask {

    @Autowired
    private OrderMapper orderMapper;

    /**
     * 处理超时订单 - 在每分钟开始的时候检查
     */
    //在每分钟的开始的时候检查
    @Scheduled(cron = "0 * * * * ?")
    public void processTimeoutOrder(){
        log.info("处理支付超时订单:{}",new Date());

        // 获取当前系统时间,得到用来判断订单是否超时的时间
        LocalDateTime time = LocalDateTime.now().plusMinutes(-15);

        // 1.通过订单的mapper,调用对应的方法,查看订单是否满足条件 - 获取订单列表
        List<Orders> orderList = orderMapper.getByStatusAndOrderTimeLT(Orders.PENDING_PAYMENT, time);
        // 判断查询到的订单列表,当列表不为空而且订单包含的订单数量大于0的时候,说明支付订单超时需要处理
        if (orderList!= null && orderList.size() > 0){
            //遍历支付超时的订单列表
            orderList.forEach(order -> {
                // 将订单状态设置为已取消
                order.setStatus(Orders.CANCELLED);
                // 设置取消订单的原因.
                order.setConsignee("支付超时,自定取消");
                // 设置订单取消的时间为当前时间
                order.setCancelTime(LocalDateTime.now());
                // 通过订单的mapper调用方法,将修改后的订单更新到数据中
                orderMapper.update(order);
            });
        }
    }

    /**
     * 处理 在 派送中的状态的订单 - 每天的凌晨1点的时候进行执行
     */
    @Scheduled(cron = "0 0 1 * *  ?")
    public void processDeliverOrder(){
        log.info("处理在派送中的订单:{}",new Date());

        //select * from orders where status = #{status} and order_time < 当前的时间-1小
        LocalDateTime time = LocalDateTime.now().plusMinutes(-60);
        List<Orders> ordersList = orderMapper.getByStatusAndOrderTimeLT(Orders.DELIVERY_IN_PROGRESS, time);

        if (ordersList!= null && ordersList.size() > 0){
            ordersList.forEach(order -> {
                order.setStatus(Orders.CANCELLED);
                orderMapper.update(order);
            });
        }
    }


}
